package com.rbac.admin.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Sa-Token 配置类
 * 
 * @author rbac-admin
 * @since 2024-07-18
 */
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
    
    /**
     * 注册Sa-Token拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册Sa-Token拦截器，打开注解式鉴权功能
        registry.addInterceptor(new SaInterceptor(handle -> {
            // 登录校验 - 所有接口都需要登录才能访问
            SaRouter.match("/**")
                    // 排除不需要登录的接口
                    .notMatch(
                            // 登录/验证码接口（考虑到前端代理会去掉 /api 前缀，这里同时排除两种写法）
                            "/auth/**",
                            "/api/auth/**",
                            "/doc.html/**",        // Swagger文档
                            "/swagger-resources/**", // Swagger资源
                            "/v3/api-docs/**",     // OpenAPI描述文件
                            "/webjars/**",         // Swagger-UI 相关资源
                            "/static/**",          // 静态资源
                            "/favicon.ico"         // 网站图标
                    )
                    // 校验登录
                    .check(r -> StpUtil.checkLogin());
            
            // 权限校验 - 不同接口校验不同权限
            SaRouter.match("/api/system/user/**", r -> StpUtil.checkPermission("system:user:list"));
            SaRouter.match("/api/system/role/**", r -> StpUtil.checkPermission("system:role:list"));
            SaRouter.match("/api/system/menu/**", r -> StpUtil.checkPermission("system:menu:list"));
            
            // 更多路由校验...
        })).addPathPatterns("/**");
    }
}